package sistemaAcademico.negocio;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.ResourceBundle;

import sistemaAcademico.pessoaDAO.PessoaDAO;
import sistemaAcademico.pessoaDAO.PessoaDAOArquivo;
import sistemaAcademico.pessoaDAO.PessoaDAOJDBC;
import sistemaAcademico.pessoaDAO.PessoaDTO;

public class Pessoa implements Serializable {

	private static final long serialVersionUID = 1L;

	private String nome;
	private String cpf;
	private String dataNascimento;
	private String endereco;
	private String telefone;
	private String identidade;
	private char sexo;
	private String email;
	private ArrayList<Papel> papeis;

	private static PessoaDAO getDao() {
		PessoaDAO dao = null;

		if (ResourceBundle.getBundle("sistemaAcademico.interfaceUsuario.PessoaMVC.resources.pessoaDao")
				.getString("metodo").equals("arquivo"))
			dao = new PessoaDAOArquivo();
		else if (ResourceBundle.getBundle("sistemaAcademico.interfaceUsuario.PessoaMVC.resources.pessoaDao").getString("metodo").equals("jdbc"))
			dao = new PessoaDAOJDBC();
		
		return dao;
	}

	public Pessoa() {
		super();
	}

	public Pessoa(String cpf) {
		this.cpf = cpf;

		PessoaDTO dto = getDao().encontrarPessoa(cpf);

		if (dto != null) {

			this.nome = dto.getNome();
			this.dataNascimento = dto.getDataNascimento();
			this.sexo = dto.getSexo();
			this.cpf = dto.getCpf();
			this.identidade = dto.getIdentidade();
			this.endereco = dto.getEndereco();
			this.telefone = dto.getTelefone();
			this.email = dto.getEmail();

			// FIXME
			// for (String matric : dto.getMatriculasPapeis()) {
			// papeis.add(new Papel(matric));
			// }
		}
	}

	public void salvar() {
		PessoaDTO dto = new PessoaDTO();

		dto.setNome(nome);
		dto.setDataNascimento(dataNascimento);
		dto.setSexo(sexo);
		dto.setCpf(cpf);
		dto.setIdentidade(identidade);
		dto.setEndereco(endereco);
		dto.setTelefone(telefone);
		dto.setEmail(email);
		// dto.setPapeis(papeis);

		getDao().salvarPessoa(dto);
	}
	
	public void update(){
		PessoaDTO dto = new PessoaDTO();

		dto.setNome(nome);
		dto.setDataNascimento(dataNascimento);
		dto.setSexo(sexo);
		dto.setCpf(cpf);
		dto.setIdentidade(identidade);
		dto.setEndereco(endereco);
		dto.setTelefone(telefone);
		dto.setEmail(email);
		// dto.setPapeis(papeis);

		getDao().updatePessoa(dto);
	}

	public void remover() {
		PessoaDTO dto = new PessoaDTO();

		dto.setNome(nome);
		dto.setDataNascimento(dataNascimento);
		dto.setSexo(sexo);
		dto.setCpf(cpf);
		dto.setIdentidade(identidade);
		dto.setEndereco(endereco);
		dto.setTelefone(telefone);
		dto.setEmail(email);
		// dto.setPapeis(papeis);

		getDao().removerPessoa(dto);
	}

	public static ArrayList<Pessoa> getLista() {
		ArrayList<Pessoa> pessoas = new ArrayList<Pessoa>();
		ArrayList<PessoaDTO> dtos = getDao().getLista();
		for (PessoaDTO dto: dtos) {
			Pessoa p = new Pessoa();
			
			
			p.setNome(dto.getNome());
			p.setDataNascimento(dto.getDataNascimento());
			p.setSexo(dto.getSexo());
			p.setCpf(dto.getCpf());
			p.setIdentidade(dto.getIdentidade());
			p.setEndereco(dto.getEndereco());
			p.setTelefone(dto.getTelefone());
			p.setEmail(dto.getEmail());
			//p.setPapeis(dto.getMatriculasPapeis());
			
			
			pessoas.add(p);
		}
		return pessoas;
	}

	public static void imprimirLista() {
		getDao().imprimirPessoas();
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(String dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getEndereco() {
		return endereco;
	}

	public void setEndereco(String endereco) {
		this.endereco = endereco;
	}

	public String getTelefone() {
		return telefone;
	}

	public void setTelefone(String telefone) {
		this.telefone = telefone;
	}

	public String getIdentidade() {
		return identidade;
	}

	public void setIdentidade(String identidade) {
		this.identidade = identidade;
	}

	public char getSexo() {
		return sexo;
	}

	public void setSexo(char sexo) {
		this.sexo = sexo;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public ArrayList<Papel> getPapeis() {
		return papeis;
	}

	public void setPapeis(ArrayList<Papel> papeis) {
		this.papeis = papeis;
	}

	protected boolean validarCPF(String cpf) {
		int d1, d2;
		int digito1, digito2, resto;
		int digitoCPF;
		String nDigResult;

		d1 = d2 = 0;
		digito1 = digito2 = resto = 0;

		for (int nCount = 1; nCount < cpf.length() - 1; nCount++) {
			digitoCPF = Integer.valueOf(cpf.substring(nCount - 1, nCount))
					.intValue();

			// multiplique a ultima casa por 2 a seguinte por 3 a seguinte por 4
			// e assim por diante.
			d1 = d1 + (11 - nCount) * digitoCPF;

			// para o segundo digito repita o procedimento incluindo o primeiro
			// digito calculado no passo anterior.
			d2 = d2 + (12 - nCount) * digitoCPF;
		}
		;

		// Primeiro resto da divisao por 11.
		resto = (d1 % 11);

		// Se o resultado for 0 ou 1 o digito é 0 caso contrario o digito é 11
		// menos o resultado anterior.
		if (resto < 2)
			digito1 = 0;
		else
			digito1 = 11 - resto;

		d2 += 2 * digito1;

		// Segundo resto da diviao por 11.
		resto = (d2 % 11);

		// Se o resultado for 0 ou 1 o digito é 0 caso contrario o digito é 11
		// menos o resultado anterior.
		if (resto < 2)
			digito2 = 0;
		else
			digito2 = 11 - resto;

		// Digito verificador do CPF que estao sendo validado.
		String nDigVerific = cpf.substring(cpf.length() - 2, cpf.length());

		// Concatenando o primeiro resto com o segundo.
		nDigResult = String.valueOf(digito1) + String.valueOf(digito2);

		// comparar o digito verificador do cpf com o primeiro resto + o segundo
		// resto.
		return nDigVerific.equals(nDigResult);
	}

}
